home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics Plus
/
Graphics Plus.iso
/
msdos
/
raytrace
/
dbwrend
/
source
/
tex.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-04-16
|
11KB
|
272 lines
/************************************************************************
* *
* Copyright (c) 1987, David B. Wecker *
* All Rights Reserved *
* *
* This file is part of DBW_Render *
* *
* DBW_Render is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY. No author or distributor accepts *
* responsibility to anyone for the consequences of using it or for *
* whether it serves any particular purpose or works at all, unless *
* he says so in writing. Refer to the DBW_Render General Public *
* License for full details. *
* *
* Everyone is granted permission to copy, modify and redistribute *
* DBW_Render, but only under the conditions described in the *
* DBW_Render General Public License. A copy of this license is *
* supposed to have been given to you along with DBW_Render so you *
* can know your rights and responsibilities. It should be in a file *
* named COPYING. Among other things, the copyright notice and this *
* notice must be preserved on all copies. *
************************************************************************
* *
* Authors: *
* DBW - David B. Wecker *
* *
* Versions: *
* V1.0 870125 DBW - First released version *
* *
************************************************************************/
#define MODULE_TEXTURE
#include "ray.h"
vector white =
{
1.0 ,1.0 ,1.0
}
;
void gettex(diffuse,np,p,n)
vector diffuse,
p,
n;
node *np;
{
int whichtexture,
i,
j,
ibx,
iby,
ibz;
float texture,
bx,
by,
bz;
long curs;
/* keep track of maximum stack extent */
curs = curstack();
if (curs < stackbot)
stackbot = curs;
whichtexture = np->attr.tex;
/* This is copied to a temp so that local solid texturing may be applied
non-destructively. */
veccopy(np->attr.dif,diffuse); /* start with the object's defined color */
if (whichtexture != 0)
{ /* don't bother checking if there's no texture */
if (whichtexture >= 20 && whichtexture < 30)
{ /* MARBLE */
j = whichtexture - 20; /* select the desired marble */
texture = p[0] * marble[j].xscale;
texture += turbulence(p) * marble[j].turbscale;
texture = (sin(texture) + 1.0) / 2.0;
for (i = 0; i < marble[j].squeeze; i++)
texture = texture * texture; /* squeeze peaks thinner */
blendcolor(diffuse,marble[j].veincolor,texture,diffuse);
}
else if (whichtexture >= 40 && whichtexture < 50)
{ /* WOOD */
/*mulvm(p,woodorient,tp);*/
j = whichtexture - 40; /* select the desired wood */
texture = sqrt(p[0]*p[0] + p[2]*p[2]);
texture *= wood[j].ringspacing;
texture += turbulence(p) * wood[j].turbscale;
texture = (sin(texture) + 1.0) / 2.0;
for (i = 0; i < wood[j].squeeze; i++)
texture = texture * texture; /* squeeze peaks thinner */
texture *= wood[j].thickscale; /* scale 0..n */
if (texture > 1.0)
texture = 1.0; /* clip to 0..1 */
blendcolor(diffuse,wood[j].othercolor,texture,diffuse);
}
else if (whichtexture >= 50 && whichtexture < 60)
{ /* CHECKERBOARD */
j = whichtexture - 50; /* select the desired checker */
ibx = 0;
iby = 0;
ibz = 0;
if (checker[j].x != 0.0)
{
texture = p[0] / checker[j].x;
if (texture < 0.0)
texture = 1.0 - texture;
ibx = (int) texture;
}
if (checker[j].y != 0.0)
{
texture = p[1] / checker[j].y;
if (texture < 0.0)
texture = 1.0 - texture;
iby = (int) texture;
}
if (checker[j].z != 0.0)
{
texture = p[2] / checker[j].z;
if (texture < 0.0)
texture = 1.0 - texture;
ibz = (int) texture;
}
if ((ibx+iby+ibz) & 1)
{
veccopy(checker[j].color,diffuse);
}
}
else if (whichtexture >= 70 && whichtexture < 80)
{ /* BLEND */
j = whichtexture - 70; /* select the desired blend */
texture = (p[1] - blend[j].start) / blend[j].scale;
if (texture > 1.0)
texture = 1.0;
if (texture < 0.0)
texture = 0.0;
blendcolor(diffuse,blend[j].color,texture,diffuse);
}
else if (whichtexture >= 80 && whichtexture < 90)
{ /* SNOW */
j = whichtexture - 80; /* select the desired snow */
texture = p[1] - snow[j].start;
texture /= snow[j].altscale;
texture *= snow[j].altfactor;
texture *= DOT(n,yaxis);
if (texture > 1.0)
texture = 1.0;
if (texture < 0.0)
texture = 0.0;
if (texture > snow[j].threshhold)
texture = 1.0;
blendcolor(diffuse,white,texture,diffuse);
}
else
switch (whichtexture)
{ /* MISC SINGULAR TEXTURES */
case 1 :
/* Y axis color gradiation */
hls(p[1]/20.0,0.5,1.0,diffuse);
break;
case 3 :
/* mottled diffuse */
vecscale(noise(p),diffuse,diffuse);
break;
case 5 :
/* Brick pattern texture */
/* First,check mortar layers in the X-Z plane */
by = p[1] / brickheight;
iby = (int) by;
by -= (float) iby; /* just save fraction */
if (by < 0.0)
by += 1.0;
if (by <= brickmortarheight)
{
/* This point is on the X-Z plane */
veccopy(mortardiffuse,diffuse);
break;
}
/* Check odd mortar layers in the Y-Z plane */
/* First calculate a common factor */
by = p[1];
by /= brickheight;
by /= 2.0;
iby = (int) by;
by -= (float) iby; /* just save fraction */
if (by < 0.0)
by += 1.0;
bx = p[0] / brickwidth;
ibx = (int) bx;
bx -= (float) ibx; /* just save fraction */
if (bx < 0.0)
bx += 1.0;
if (bx <= brickmortarwidth)
{
/* So this point is on the Y-Z mortar plane. We now must
factor in the odd staggered brick effect */
if (by <= 0.5)
{
veccopy(mortardiffuse,diffuse);
break;
}
}
/* Check even mortar layers in the Y-Z plane */
bx = (p[0] / brickwidth) + 0.5;
ibx = (int) bx;
bx -= (float) ibx; /* just save fraction */
if (bx < 0.0)
bx += 1.0;
if (bx <= brickmortarwidth)
{
/* So this point is on the Y-Z mortar plane. We now must
factor in the even staggered brick effect */
if (by > 0.5)
{
veccopy(mortardiffuse,diffuse);
break;
}
}
/* Check odd mortar layers in the Y-X plane */
bz = p[2] / brickdepth;
ibz = (int) bz;
bz -= (float) ibz; /* just save fraction */
if (bz < 0.0)
bz += 1.0;
if (bz <= brickmortardepth)
{
/* So this point is on the Y-X mortar plane. We now must
factor in the odd staggered brick effect */
if (by > 0.5)
{
veccopy(mortardiffuse,diffuse);
break;
}
}
/* Check even mortar layers in the Y-X plane */
bz = (p[2] / brickdepth) + 0.5;
ibz = (int) bz;
bz -= (float) ibz; /* just save fraction */
if (bz < 0.0)
bz += 1.0;
if (bz <= brickmortardepth)
{
/* So this point is on the Y-X mortar plane. We now must
factor in the even staggered brick effect */
if (by <= 0.5)
{
veccopy(mortardiffuse,diffuse);
break;
}
}
/* So we're inside a brick */
break;
}
}
}